银联商务大华捷通综合支付公众号支付代码片段参考

专业的综合支付与信息服务提供商,提供丰富的支付+行业解决方案,满足各合作伙伴对支付服务的多样场景化需求。
声明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。
该代码仅供参考,不提供编码,性能,规范性等方面的保障

JAVA语言

1.商户系统主动请求大华捷通系统签名示例

签名规则
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数

生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
					public static void gzh() throws UnsupportedEncodingException {
							TreeMap treeMap = new TreeMap();
							treeMap.put("version", "20191031");
							treeMap.put("msgId", "4217");
							treeMap.put("msgType", "");
							treeMap.put("requestTimestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
							treeMap.put("expireTime", "");
							treeMap.put("merOrderId", "4217" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
							treeMap.put("mid", mid);
							treeMap.put("tid",tid);
							treeMap.put("instMid", "YUEDANDEFAULT");
							treeMap.put("attachedData","");
							treeMap.put("orderDesc","");
							treeMap.put("originalAmount", "");
							treeMap.put("totalAmount", "1");
							treeMap.put("notifyUrl", "http://ip:port/server/notify");
							treeMap.put("signType", "SHA256");
							treeMap.put("extend1","extend1");
							treeMap.put("extend2","extend2");
							treeMap.put("extend3","extend3");
							treeMap.put("extend4","extend4");
							StringBuffer sb = new StringBuffer();// 代签名的字符串
							StringBuffer req = new StringBuffer();// 组织请求参数
							for (String key : treeMap.keySet()) {
								if (treeMap.get(key) != null && !"".equals(treeMap.get(key))) {
									if (sb.length() == 0) {
										sb.append(key + "=" + treeMap.get(key));
										req.append(key + "=" + URLEncoder.encode(treeMap.get(key), "UTF-8"));
									} else {
										sb.append("&" + key + "=" + treeMap.get(key));
										req.append("&" + key + "=" + URLEncoder.encode(treeMap.get(key), "UTF-8"));
									}
								}
							}
							System.out.println("待签名的字符串是:" + sb.toString());
							String sign = "";
							try {
								sign = SM3Util.SHA256(sb.toString() + signKey);
							} catch (Exception e) {
							}
							System.out.println("sign的值是:" + sign);
							req.append("&sign=" + URLEncoder.encode(sign, "UTF-8"));// 将签名信息添加在请求参数后面
							System.out.println("公众号支付实际跳转的URL是:" + pay_url + req.toString());
						}
					

2.大华捷通系统同步响应到商户系统验签示例

同步响应一般是服务器端对接时,向大华捷通系统发起交易查询、退款请求、退款状态查询,关闭订单等交易时,大华捷通系统同步返回的json格式的数据,商户收到响应后,建议对签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数

生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
/**
	 * String ret=demo.HttpGet.get(query_url);//发起http请求,此处用查询支付结果接口举例
	 * @param data  JSONObject retJson=JSONObject.fromObject(ret);//将json字符串转成json对象
	 * @param sign  String sign=retJson.optString("sign");//获取大华捷通应答的签名信息
	 * @return 根据上面的参数调用验签方法,返回延签是否通过
	 */
public static boolean checkSign(JSONObject data,String sign){
//1.遍历返回的json数据,将参数值非空的放入TreeMap集合
TreeMap map = new TreeMap();
for (Object key : data.keySet()) {
String value = data.optString((String) key);
if(value!=null &&!"".equals(value) && !"sign".equals(key)){
map.put((String) key, value);
}
}
//2.TreeMap集合会自动按key进行排序,遍历map,组织签名字符串
StringBuffer buffer=new StringBuffer();
for(String key:map.keySet()){
if(buffer.length()==0){
buffer.append(key+"="+map.get(key));
}else{
buffer.append("&"+key+"="+map.get(key));
}
}
//3.将拼接好的字符串+秘钥进行签名,此处使用SHA256
String localMac = SM3Util.SHA256(buffer.toString()+signKey);
System.out.println("本地计算的mac:"+localMac);
//4.对比签名是否一致
if(sign.equalsIgnoreCase(localMac)){
System.out.println("验签通过");
return true;
}else{
System.out.println("验签失败");
}
return false;
}
					

3.大华捷通系统同步跳转到商户系统验签示例

同步跳转到商户系统,是基于浏览器跳转的,如:扫码支付,公众号支付,h5支付,网银等支付交易并且下单时传入了returnUrl参数时,才会存在,并且跳转的地址也是returnUrl参数值上,商户再收到同步跳转的请求时,需要获取所有的参数信息,根据errCode取值判断同步跳转回来的原因,如果errCode是SUCCESS,则需要根据status支付状态进行下一步业务处理,展示出相应的页面给付款人。商户收到响应后,建议对签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.获取全部的请求参数中,除去sign和空值的参数外,其他的参数均为要签名的参数

生成待签名字符串
第一步:设所有接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
private void returnMethod(HttpServletRequest request,
			HttpServletResponse response) {
		logger.info("*********************************支付return方法执行**********************************");
		try {
			logger.info("************支付结果同步返回的参数信息开始************");
			TreeMap tm = new TreeMap();
			Enumeration requestNames = request.getParameterNames();
			while(requestNames.hasMoreElements()){
				String key = requestNames.nextElement();
				String value = request.getParameter(key);
				tm.put(key, URLDecoder.decode(value, "UTF-8"));
				logger.info(key+":"+URLDecoder.decode(value, "UTF-8"));
			}
			logger.info("************支付结果同步返回的参数信息结束************");
			Set keySet = tm.keySet();
			StringBuffer signStr=new StringBuffer();
			Iterator iter = keySet.iterator();
	        while (iter.hasNext()) {
	            String key = iter.next();
	            if (tm.get(key) != null && !"".equals(tm.get(key))) {
	            if(signStr.length()==0){signStr.append(key + "=" + tm.get(key));}else{signStr.append("&"+key + "=" + tm.get(key));}
	            }
	        }
			logger.info("待验签的字符串:",signStr.toString());
			String signKey="1111111111111111111111111111111111111111111111111111111111111111";
			String localSign="";
			try {
				localSign = SM3Util.getSHA256(signStr.toString()+signKey);
			} catch (Exception e) {
			}
			logger.info("本地签名的值是:",localSign);
			//然后与大华捷通响应的sign进行对比,此处需要忽略大小写
			if(localSign.equalsIgnoreCase(tm.get("sign"))){
				logger.info("验签通过");
			}else{
				logger.info("验签不通过");
			}
			//取出errCode和status的参数值
			String errCode=tm.get("errCode")==null?"":tm.get("errCode");
			String status=tm.get("status")==null?"":tm.get("status");
			if("SUCCESS".equest(errCode)){
				if("TRADE_SUCCESS".equest(status)){
					//支付成功,跳转到支付成功页面,此处建议在调用一次查询接口,确认支付状态
				}else{
					//支付失败,跳转到支付失败页面,此处建议在调用一次查询接口,确认支付状态
				}
			}else{
				//支付请求失败,失败原因在errMsg上,取出来提示给付款人
			}
		} catch (Exception e) {
			logger.info("同步返回异常:",e);
			//是否需要跳转异常页面,商户自行处理
		}
	}

4.大华捷通系统异步推送商户系统验签示例

异步推送是服务器端对接时,支付完成后,大华捷通服务器收到渠道方返回的支付通知后,会进行通知给商户,商户收到响应后,需要在超时时间内做出应答,大华捷通再未收到应答或者应答不是SUCCESS时,会多次进行推送,商户需要做好同一个订单可能会推送多次情况的处理, 异步推送签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数

生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
private void returnMethod(HttpServletRequest request,
			HttpServletResponse response) {
		logger.info("*********************************支付return方法执行**********************************");
		try {
			logger.info("************支付结果同步返回的参数信息开始************");
			TreeMap tm = new TreeMap();
			Enumeration requestNames = request.getParameterNames();
			while(requestNames.hasMoreElements()){
				String key = requestNames.nextElement();
				String value = request.getParameter(key);
				tm.put(key, URLDecoder.decode(value, "UTF-8"));
				logger.info(key+":"+URLDecoder.decode(value, "UTF-8"));
			}
			logger.info("************支付结果同步返回的参数信息结束************");
			Set keySet = tm.keySet();
			StringBuffer signStr=new StringBuffer();
			Iterator iter = keySet.iterator();
	        while (iter.hasNext()) {
	            String key = iter.next();
	            if(signStr.length()==0){signStr.append(key + "=" + tm.get(key));}else{signStr.append("&"+key + "=" + tm.get(key));}
	        }
			logger.info("待验签的字符串:",signStr.toString());
			String signKey="1111111111111111111111111111111111111111111111111111111111111111";
			String localSign="";
			try {
				localSign = SM3Util.getSHA256(signStr.toString()+signKey);
			} catch (Exception e) {
			}
			logger.info("本地签名的值是:",localSign);
			//然后与大华捷通响应的sign进行对比,此处需要忽略大小写
			if(localSign.equalsIgnoreCase(tm.get("sign"))){
				logger.info("验签通过");
			}else{
				logger.info("验签不通过");
			}
		} catch (Exception e) {
			logger.info("同步返回异常:",e);
		}
	}

PHP语言

1.商户系统主动请求大华捷通系统签名示例

签名规则
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数

生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
					
					

2.大华捷通系统同步响应到商户系统验签示例

同步响应一般是服务器端对接时,向大华捷通系统发起交易查询、退款请求、退款状态查询,关闭订单等交易时,大华捷通系统同步返回的json格式的数据,商户收到响应后,建议对签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数

生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
					
					

3.大华捷通系统同步跳转到商户系统验签示例

同步跳转到商户系统,是基于浏览器跳转的,如:扫码支付,公众号支付,h5支付,网银等支付交易并且下单时传入了returnUrl参数时,才会存在,并且跳转的地址也是returnUrl参数值上,商户再收到同步跳转的请求时,需要获取所有的参数信息,根据errCode取值判断同步跳转回来的原因,如果errCode是SUCCESS,则需要根据status支付状态进行下一步业务处理,展示出相应的页面给付款人。商户收到响应后,建议对签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.获取全部的请求参数中,除去sign和空值的参数外,其他的参数均为要签名的参数

生成待签名字符串
第一步:设所有接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
					
					

4.大华捷通系统异步推送商户系统验签示例

异步推送是服务器端对接时,支付完成后,大华捷通服务器收到渠道方返回的支付通知后,会进行通知给商户,商户收到响应后,需要在超时时间内做出应答,大华捷通再未收到应答或者应答不是SUCCESS时,会多次进行推送,商户需要做好同一个订单可能会推送多次情况的处理, 异步推送签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数

生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
					
					

C#语言

1.商户系统主动请求大华捷通系统签名示例

签名规则
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数

生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
					
					

2.大华捷通系统同步响应到商户系统验签示例

同步响应一般是服务器端对接时,向大华捷通系统发起交易查询、退款请求、退款状态查询,关闭订单等交易时,大华捷通系统同步返回的json格式的数据,商户收到响应后,建议对签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数

生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
					
					

3.大华捷通系统同步跳转到商户系统验签示例

同步跳转到商户系统,是基于浏览器跳转的,如:扫码支付,公众号支付,h5支付,网银等支付交易并且下单时传入了returnUrl参数时,才会存在,并且跳转的地址也是returnUrl参数值上,商户再收到同步跳转的请求时,需要获取所有的参数信息,根据errCode取值判断同步跳转回来的原因,如果errCode是SUCCESS,则需要根据status支付状态进行下一步业务处理,展示出相应的页面给付款人。商户收到响应后,建议对签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.获取全部的请求参数中,除去sign和空值的参数外,其他的参数均为要签名的参数

生成待签名字符串
第一步:设所有接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
					
					

4.大华捷通系统异步推送商户系统验签示例

异步推送是服务器端对接时,支付完成后,大华捷通服务器收到渠道方返回的支付通知后,会进行通知给商户,商户收到响应后,需要在超时时间内做出应答,大华捷通再未收到应答或者应答不是SUCCESS时,会多次进行推送,商户需要做好同一个订单可能会推送多次情况的处理, 异步推送签名信息进行验证,验证规则如下:
1.签名支持SM3(推荐)和SHA256方式(不上送signType字段时,SM3),计算sign的输入数据为待签名字符串加上key(即:签名密钥),key由大华捷通平台分配。
2.在请求参数列表中,除去sign和空值的参数外,其他需要使用到的参数均为要签名的参数

生成待签名字符串
第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:
(1).参数名ASCII码从小到大排序(字典序);
(2).如果参数的值为空不参与签名;
(3).参数名区分大小写;
(4).验证调用返回时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
(5).大华捷通平台接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行SHA256运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
//代码建议复制到开发工具中格式化一下,便于阅读
					
					

在线支付测试(包含JS实例代码)

公众号支付需要在手机微信支付宝云闪付app内运行,如果你是通过微信支付宝云闪付app阅读此文档,就可以直接点击下面支付按钮进行支付
如果你是在PC端阅读此文档,你可以将下面表单中的 支付url复制到微信支付宝聊天界面,在微信 支付宝中 点击链接完成支付
你也可以使用微信支付宝云闪付app扫码下方支付二维码,完成支付体验
  • 体验二维码
  • 前端javaScript组织请求参数示例
  • 前端javaScript代码截图
//监听左侧表单[组织请求URL]按钮,获取输入框的参数值
form.on('submit(getRequestUrl)', function(data){
//固定常量值
var versionValue="20191031";
var msgIdValue="4217";
var instMidValue="MINIDEFAULT";
var signTypeValue="SHA256";
//获取支付参数
var merOrderIdValue=data.field.merOrderId;
var midValue=data.field.mid;
var tidValue=data.field.tid;
var totalAmountValue=data.field.totalAmount;
var orderDescValue=data.field.orderDesc;
var notifyUrlValue=data.field.notifyUrl;
var returnUrlValue=data.field.returnUrl;
var requestTimestampValue=data.field.requestTimestamp;
//这个参数是签名使用
var signkey=data.field.signkey;
//支付的接口地址
var requestUrl="https://dhjt-uat.chinaums.com/queryService/UmsWebPayPlugins?";
//申明一个map集合,将所有参数和参数值放入map中,这个集合就是要发送到大华捷通支付接口的所有数据
	var myMap = {
		instMid:instMidValue,
		signType:signTypeValue,
		version:versionValue,
		msgId:msgIdValue,
		merOrderId:merOrderIdValue,
		mid:midValue,
		tid:tidValue,
		totalAmount:totalAmountValue,
		orderDesc:orderDescValue,
		notifyUrl:notifyUrlValue,
		requestTimestamp:requestTimestampValue,
		returnUrl:returnUrlValue
	};
	//申明一个数组,遍历map将key放入数组进行排序
	var arr = new Array();
	for(var key in myMap){
	console.log("属性:" + key + ",值:" + myMap[key]);
	arr.push(key);
	}
	console.log("排序前:"+arr);
	arr.sort();
	console.log("排序后:"+arr);
	var signStr="";//待签名的字符串
	var reqStr="";//发送请求的url
	var len = arr.length
	for(var i = 0; i < len; i++) {
		if(myMap[arr[i]]!=undefined && myMap[arr[i]]!=""){
				if(signStr==""){
					signStr+=arr[i]+"="+myMap[arr[i]];
					reqStr+=arr[i]+"="+encodeURIComponent(myMap[arr[i]]);
				}else{
					signStr+="&"+arr[i]+"="+myMap[arr[i]];
					reqStr+="&"+arr[i]+"="+encodeURIComponent(myMap[arr[i]]);
				}
		}
	}
	var signValue=layui.sha256(signStr+signkey).toUpperCase();
	console.log("待签名字符串:"+signStr+signkey+"\n\nSHA256结果是:"+signValue);
	console.log("最终请求大华捷通的URL:"+requestUrl+reqStr+"&sign="+encodeURIComponent(signValue));
});